#ifndef __losor_operator_h__
#define __losor_operator_h__

#include "token.h"
#include "expression.h"
#include "symbol.h"

#ifdef __cplusplus
extern "C" {
#endif


    exp_tree* lex_comma( exp_tree *opd1, exp_tree *opd2 );
    exp_tree* lex_assign( exp_tree *opd1, exp_tree *opd2 );
    exp_tree* lex_assign_mul( exp_tree *opd1, exp_tree *opd2 );
    exp_tree* lex_assign_dev( exp_tree *opd1, exp_tree *opd2 );
    exp_tree* lex_assign_mod( exp_tree *opd1, exp_tree *opd2 );
    exp_tree* lex_assign_add( exp_tree *opd1, exp_tree *opd2 );
    exp_tree* lex_assign_sub( exp_tree *opd1, exp_tree *opd2 );
    exp_tree* lex_assign_shift_l( exp_tree *opd1, exp_tree *opd2 );
    exp_tree* lex_assign_shift_r( exp_tree *opd1, exp_tree *opd2 );
    exp_tree* lex_assign_and( exp_tree *opd1, exp_tree *opd2 );
    exp_tree* lex_assign_xor( exp_tree *opd1, exp_tree *opd2 );
    exp_tree* lex_assign_or( exp_tree *opd1, exp_tree *opd2 );
    exp_tree* lex_condition( exp_tree *opd1, exp_tree *opd2, exp_tree *opd3 );
    exp_tree* lex_logical_or( exp_tree *opd1, exp_tree *opd2 );
    exp_tree* lex_logical_and( exp_tree *opd1, exp_tree *opd2 );
    exp_tree* lex_inclusive_or( exp_tree *opd1, exp_tree *opd2 );
    exp_tree* lex_exclusive_or( exp_tree *opd1, exp_tree *opd2 );
    exp_tree* lex_and( exp_tree *opd1, exp_tree *opd2 );
    exp_tree* lex_equal( exp_tree *opd1, exp_tree *opd2 );
    exp_tree* lex_unequal( exp_tree *opd1, exp_tree *opd2 );
    exp_tree* lex_small( exp_tree *opd1, exp_tree *opd2 );
    exp_tree* lex_large( exp_tree *opd1, exp_tree *opd2 );
    exp_tree* lex_small_equal( exp_tree *opd1, exp_tree *opd2 );
    exp_tree* lex_large_equal( exp_tree *opd1, exp_tree *opd2 );
    exp_tree* lex_shift_l( exp_tree *opd1, exp_tree *opd2 );
    exp_tree* lex_shift_r( exp_tree *opd1, exp_tree *opd2 );
    exp_tree* lex_add( exp_tree *opd1, exp_tree *opd2 );
    exp_tree* lex_sub( exp_tree *opd1, exp_tree *opd2 );
    exp_tree* lex_mul( exp_tree *opd1, exp_tree *opd2 );
    exp_tree* lex_dev( exp_tree *opd1, exp_tree *opd2 );
    exp_tree* lex_mod( exp_tree *opd1, exp_tree *opd2 );
    exp_tree* lex_cat( exp_tree *opd1, exp_tree *opd2 );
    exp_tree* lex_address( exp_tree *opd1 );
    exp_tree* lex_value( exp_tree *opd1 );
    exp_tree* lex_positive( exp_tree *opd1 );
    exp_tree* lex_negative( exp_tree *opd1 );
    exp_tree* lex_not( exp_tree *opd1 );
    exp_tree* lex_logicl_not( exp_tree *opd1 );
    exp_tree* lex_sizeof( exp_tree *opd1 );
    exp_tree* lex_array( exp_tree *opd1, exp_tree *opd2 );
    // to be considered
    exp_tree* lex_call( token *func, exp_tree *opd, ... );
    exp_tree* lex_dot( exp_tree *opd1, exp_tree *opd2 );
    exp_tree* lex_point( exp_tree *opd1, exp_tree *opd2 );
    exp_tree* lex_inc_pre( exp_tree *opd1 );
    exp_tree* lex_inc_post( exp_tree *opd1 );
    exp_tree* lex_dec_pre( exp_tree *opd1 );
    exp_tree* lex_dec_post( exp_tree *opd1 );
    exp_tree* lex_parentheses( exp_tree *opd1 );

#ifdef __cplusplus
};
#endif

#endif // __losor_operator_h__